type EventCallback<T> = (payload: T) => void;

/**
 * EventBus 类，用于管理事件监听器和触发事件。
 * @template T - 事件载荷的类型。
 */
class EventBus<T> {
  // 存储事件监听器的 Map，键是事件名称，值是事件回调数组。
  private listeners: Map<string, EventCallback<T>[]> = new Map();

  /**
   * 注册一个特定事件的监听器。
   * @param event - 要监听的事件名称。
   * @param listener - 当事件被触发时执行的回调函数。
   */
  on(event: string, listener: EventCallback<T>): void {
    console.log(`EventBus: 注册事件 ${event}`);
    if (!this.listeners.has(event)) {
      this.listeners.set(event, []);
    }
    this.listeners.get(event)!.push(listener);
  }

  /**
   * 注销一个特定事件的监听器。
   * @param event - 要取消监听的事件名称。
   * @param listener - 要取消的回调函数。
   */
  off(event: string, listener: EventCallback<T>): void {
    console.log(`EventBus: 取消事件 ${event}`);
    const eventListeners = this.listeners.get(event);
    if (!eventListeners) return;

    const index = eventListeners.indexOf(listener);
    if (index > -1) {
      eventListeners.splice(index, 1);
    }
  }

  /**
   * 触发一个特定的事件，并传递载荷给每个监听器。
   * @param event - 要触发的事件名称。
   * @param payload - 传递给监听器的载荷。
   */
  emit(event: string, payload: T): void {
    console.log(`EventBus: 触发事件 ${event}`);
    const eventListeners = this.listeners.get(event);
    if (!eventListeners) return;

    eventListeners.forEach(listener => listener(payload));
  }
}

export const loadingEventBus = new EventBus<string>();